package com.knowledge.plus.web.monitor;

import org.springframework.context.event.EventListener;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import java.util.Map;

/**
 * 注解 @EventListener
 *
 * @author TPF
 * @since 2024/7/31
 */
@Service
public class MonitorHandler {

    /**
     * 注解 @EventListener 在Spring框架中用于标记那些应该在特定应用事件发生时被通知的方法
     * 目的：
     * 此注解允许你无需显式注册或配置即可创建事件监听器。当应用于方法时，它表明该方法应在发布特定类型事件时被调用
     * -
     * 使用方式：
     * 被 @EventListener 注解的方法可以是任何由Spring管理的bean的一部分，这种方法通常接受一个参数，即被监听的事件对象。
     * -
     * 事件类型：你可以通过@EventListener注解的condition属性（对于更复杂的条件）或者仅仅通过将事件类作为方法参数类型来指定方法应监听的事件类型。
     * 顺序与优先级：根据@EventListener注解中设置的优先级，事件可以按特定顺序处理，这允许对不同监听器何时触发进行精细控制。
     */
    @Async
    // @EventListener(condition =  "#event.exception instanceof MySpecificException")
    @EventListener(classes = {String.class})    // 当Spring容器中发布String类型的事件时会自动调用此方法
    public void businessHandle(Object object) {
        if (object != null) {
            System.out.println("MonitorHandler  执行相应的业务逻辑，比如记录日志、发送通知等");
        }
    }

    @Async
    @EventListener(classes = {Map.class})
    public void businessHandle(Map<String, Object> map) {
        // 模拟数据入库
        System.out.println("MonitorHandler  数据入库：" + map);
    }

}
